#include <iostream>
#include <vector>

template <typename T>
struct Expression
{
};

template <typename E1, typename E2>
struct VecSum : Expression<VecSum<E1, E2>>
{
    const E1& u;
    const E2& v;
    
    //聚合类也必须写, 模板不能识别 initializer_list 。。。。
    VecSum(const E1& e1, const E2& e2) : u(e1), v(e2) {}

    double operator[](int i) const {
        return u[i] + v[i];
    }
};

template<typename E1, typename E2>
VecSum<E1, E2> operator+(const E1& e1, const E2& e2)
{
    return VecSum<E1, E2>{ e1, e2 };
}

struct Vec
{
    std::vector<double> elems;

    double operator[](int i) const {
        return elems[i];
    }  
};


int main() {
    Vec v0 = { {1.0, 2.0, 3.0} };
    Vec v1 = { {2.0, 3.0, 4.0} };
    Vec v2 = { {3.0, 4.0, 5.0} };

    //auto v3 = v0 + v1;
    auto v3 = v0 + v1 + v2;

    std::cout << "v3[0]: " << v3[0] << std::endl;
    std::cout << "v3[1]: " << v3[1] << std::endl;
    std::cout << "v3[2]: " << v3[2] << std::endl;

    return 0;
}